home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / aerofgt.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  20KB  |  722 lines

  1. #include "driver.h"
  2.  
  3.  
  4. extern unsigned char *spriteram_2;
  5. extern size_t spriteram_2_size;
  6. unsigned char *aerofgt_rasterram;
  7. unsigned char *aerofgt_bg1videoram,*aerofgt_bg2videoram;
  8. unsigned char *aerofgt_spriteram1,*aerofgt_spriteram2;
  9. size_t aerofgt_spriteram1_size,aerofgt_spriteram2_size;
  10.  
  11. static unsigned char gfxbank[8];
  12. static unsigned char bg1scrollx[2],bg1scrolly[2],bg2scrollx[2],bg2scrolly[2];
  13.  
  14. static int charpalettebank,spritepalettebank;
  15.  
  16. static struct tilemap *bg1_tilemap,*bg2_tilemap;
  17. static int sprite_gfx;
  18.  
  19.  
  20. /***************************************************************************
  21.  
  22.   Callbacks for the TileMap code
  23.  
  24. ***************************************************************************/
  25.  
  26. static void get_pspikes_tile_info(int tile_index)
  27. {
  28.     UINT16 code = READ_WORD(&aerofgt_bg1videoram[2*tile_index]);
  29.     int bank = (code & 0x1000) >> 12;
  30.     SET_TILE_INFO(0,(code & 0x0fff) + (gfxbank[bank] << 12),((code & 0xe000) >> 13) + 8 * charpalettebank)
  31. }
  32.  
  33. static void karatblz_bg1_tile_info(int tile_index)
  34. {
  35.     UINT16 code = READ_WORD(&aerofgt_bg1videoram[2*tile_index]);
  36.     SET_TILE_INFO(0,(code & 0x1fff) + (gfxbank[0] << 13),(code & 0xe000) >> 13)
  37. }
  38.  
  39. /* also spinlbrk */
  40. static void karatblz_bg2_tile_info(int tile_index)
  41. {
  42.     UINT16 code = READ_WORD(&aerofgt_bg2videoram[2*tile_index]);
  43.     SET_TILE_INFO(1,(code & 0x1fff) + (gfxbank[1] << 13),(code & 0xe000) >> 13)
  44. }
  45.  
  46. static void spinlbrk_bg1_tile_info(int tile_index)
  47. {
  48.     UINT16 code = READ_WORD(&aerofgt_bg1videoram[2*tile_index]);
  49.     SET_TILE_INFO(0,(code & 0x0fff) + (gfxbank[0] << 12),(code & 0xf000) >> 12)
  50. }
  51.  
  52. static void get_bg1_tile_info(int tile_index)
  53. {
  54.     UINT16 code = READ_WORD(&aerofgt_bg1videoram[2*tile_index]);
  55.     int bank = (code & 0x1800) >> 11;
  56.     SET_TILE_INFO(0,(code & 0x07ff) + (gfxbank[bank] << 11),(code & 0xe000) >> 13)
  57. }
  58.  
  59. static void get_bg2_tile_info(int tile_index)
  60. {
  61.     UINT16 code = READ_WORD(&aerofgt_bg2videoram[2*tile_index]);
  62.     int bank = 4 + ((code & 0x1800) >> 11);
  63.     SET_TILE_INFO(1,(code & 0x07ff) + (gfxbank[bank] << 11),(code & 0xe000) >> 13)
  64. }
  65.  
  66.  
  67. /***************************************************************************
  68.  
  69.   Start the video hardware emulation.
  70.  
  71. ***************************************************************************/
  72.  
  73. int pspikes_vh_start(void)
  74. {
  75.     bg1_tilemap = tilemap_create(get_pspikes_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,8,8,64,32);
  76.     /* no bg2 in this game */
  77.  
  78.     if (!bg1_tilemap)
  79.         return 1;
  80.  
  81.     sprite_gfx = 1;
  82.  
  83.     return 0;
  84. }
  85.  
  86. int karatblz_vh_start(void)
  87. {
  88.     bg1_tilemap = tilemap_create(karatblz_bg1_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,64,64);
  89.     bg2_tilemap = tilemap_create(karatblz_bg2_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,64);
  90.  
  91.     if (!bg1_tilemap || !bg2_tilemap)
  92.         return 1;
  93.  
  94.     bg2_tilemap->transparent_pen = 15;
  95.  
  96.     spritepalettebank = 0;
  97.  
  98.     sprite_gfx = 2;
  99.  
  100.     return 0;
  101. }
  102.  
  103. int spinlbrk_vh_start(void)
  104. {
  105.     int i;
  106.  
  107.     bg1_tilemap = tilemap_create(spinlbrk_bg1_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,64,64);
  108.     bg2_tilemap = tilemap_create(karatblz_bg2_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,64);
  109.  
  110.     if (!bg1_tilemap || !bg2_tilemap)
  111.         return 1;
  112.  
  113.     bg2_tilemap->transparent_pen = 15;
  114.  
  115.     spritepalettebank = 0;
  116.  
  117.     sprite_gfx = 2;
  118.  
  119.  
  120.     /* sprite maps are hardcoded in this game */
  121.  
  122.     /* enemy sprites use ROM instead of RAM */
  123.     aerofgt_spriteram2 = memory_region(REGION_GFX5);
  124.     aerofgt_spriteram2_size = 0x20000;
  125.  
  126.     /* front sprites are direct maps */
  127.     aerofgt_spriteram1 = aerofgt_spriteram2 + aerofgt_spriteram2_size;
  128.     aerofgt_spriteram1_size = 0x4000;
  129.     for (i = 0;i < aerofgt_spriteram1_size/2;i++)
  130.         WRITE_WORD(&aerofgt_spriteram1[2*i],i);
  131.  
  132.     return 0;
  133. }
  134.  
  135. int turbofrc_vh_start(void)
  136. {
  137.     bg1_tilemap = tilemap_create(get_bg1_tile_info,tilemap_scan_rows,TILEMAP_OPAQUE,     8,8,64,64);
  138.     bg2_tilemap = tilemap_create(get_bg2_tile_info,tilemap_scan_rows,TILEMAP_TRANSPARENT,8,8,64,64);
  139.  
  140.     if (!bg1_tilemap || !bg2_tilemap)
  141.         return 1;
  142.  
  143.     bg2_tilemap->transparent_pen = 15;
  144.  
  145.     spritepalettebank = 0;
  146.  
  147.     sprite_gfx = 2;
  148.  
  149.     return 0;
  150. }
  151.  
  152.  
  153.  
  154. /***************************************************************************
  155.  
  156.   Memory handlers
  157.  
  158. ***************************************************************************/
  159.  
  160. READ_HANDLER( aerofgt_rasterram_r )
  161. {
  162.     return READ_WORD(&aerofgt_rasterram[offset]);
  163. }
  164.  
  165. WRITE_HANDLER( aerofgt_rasterram_w )
  166. {
  167.     COMBINE_WORD_MEM(&aerofgt_rasterram[offset],data);
  168. }
  169.  
  170. READ_HANDLER( aerofgt_spriteram_2_r )
  171. {
  172.     return READ_WORD(&spriteram_2[offset]);
  173. }
  174.  
  175. WRITE_HANDLER( aerofgt_spriteram_2_w )
  176. {
  177.     COMBINE_WORD_MEM(&spriteram_2[offset],data);
  178. }
  179.  
  180. READ_HANDLER( aerofgt_bg1videoram_r )
  181. {
  182.     return READ_WORD(&aerofgt_bg1videoram[offset]);
  183. }
  184.  
  185. READ_HANDLER( aerofgt_bg2videoram_r )
  186. {
  187.     return READ_WORD(&aerofgt_bg2videoram[offset]);
  188. }
  189.  
  190. WRITE_HANDLER( aerofgt_bg1videoram_w )
  191. {
  192.     int oldword = READ_WORD(&aerofgt_bg1videoram[offset]);
  193.     int newword = COMBINE_WORD(oldword,data);
  194.  
  195.     if (oldword != newword)
  196.     {
  197.         WRITE_WORD(&aerofgt_bg1videoram[offset],newword);
  198.         tilemap_mark_tile_dirty(bg1_tilemap,offset/2);
  199.     }
  200. }
  201.  
  202. WRITE_HANDLER( aerofgt_bg2videoram_w )
  203. {
  204.     int oldword = READ_WORD(&aerofgt_bg2videoram[offset]);
  205.     int newword = COMBINE_WORD(oldword,data);
  206.  
  207.     if (oldword != newword)
  208.     {
  209.         WRITE_WORD(&aerofgt_bg2videoram[offset],newword);
  210.         tilemap_mark_tile_dirty(bg2_tilemap,offset/2);
  211.     }
  212. }
  213.  
  214.  
  215. static void setbank(struct tilemap *tmap,int num,int bank)
  216. {
  217.     if (gfxbank[num] != bank)
  218.     {
  219.         gfxbank[num] = bank;
  220.         tilemap_mark_all_tiles_dirty(tmap);
  221.     }
  222. }
  223.  
  224. WRITE_HANDLER( pspikes_gfxbank_w )
  225. {
  226.     if ((data & 0x00ff0000) == 0)
  227.     {
  228.         setbank(bg1_tilemap,0,(data & 0xf0) >> 4);
  229.         setbank(bg1_tilemap,1,data & 0x0f);
  230.     }
  231. }
  232.  
  233. WRITE_HANDLER( karatblz_gfxbank_w )
  234. {
  235.     if ((data & 0xff000000) == 0)
  236.     {
  237.         setbank(bg1_tilemap,0,(data & 0x0100) >> 8);
  238.         setbank(bg2_tilemap,1,(data & 0x0800) >> 11);
  239.     }
  240. }
  241.  
  242. WRITE_HANDLER( spinlbrk_gfxbank_w )
  243. {
  244.     if ((data & 0x00ff0000) == 0)
  245.     {
  246.         setbank(bg1_tilemap,0,(data & 0x07));
  247.         setbank(bg2_tilemap,1,(data & 0x38) >> 3);
  248.     }
  249. }
  250.  
  251. WRITE_HANDLER( turbofrc_gfxbank_w )
  252. {
  253.     static unsigned char old[4];
  254.     int newword;
  255.     struct tilemap *tmap = (offset < 2) ? bg1_tilemap : bg2_tilemap;
  256.  
  257.     COMBINE_WORD_MEM(&old[offset],data);
  258.     newword = READ_WORD(&old[offset]);
  259.  
  260.     setbank(tmap,2*offset + 0,(newword >>  0) & 0x0f);
  261.     setbank(tmap,2*offset + 1,(newword >>  4) & 0x0f);
  262.     setbank(tmap,2*offset + 2,(newword >>  8) & 0x0f);
  263.     setbank(tmap,2*offset + 3,(newword >> 12) & 0x0f);
  264. }
  265.  
  266. WRITE_HANDLER( aerofgt_gfxbank_w )
  267. {
  268.     static unsigned char old[8];
  269.     int newword;
  270.     struct tilemap *tmap = (offset < 4) ? bg1_tilemap : bg2_tilemap;
  271.  
  272.     COMBINE_WORD_MEM(&old[offset],data);
  273.     newword = READ_WORD(&old[offset]);
  274.  
  275.     setbank(tmap,offset + 0,(newword >> 8) & 0xff);
  276.     setbank(tmap,offset + 1,(newword >> 0) & 0xff);
  277. }
  278.  
  279. WRITE_HANDLER( aerofgt_bg1scrollx_w )
  280. {
  281.     COMBINE_WORD_MEM(bg1scrollx,data);
  282. }
  283.  
  284. WRITE_HANDLER( aerofgt_bg1scrolly_w )
  285. {
  286.     COMBINE_WORD_MEM(bg1scrolly,data);
  287. }
  288.  
  289. WRITE_HANDLER( aerofgt_bg2scrollx_w )
  290. {
  291.     COMBINE_WORD_MEM(bg2scrollx,data);
  292. }
  293.  
  294. WRITE_HANDLER( aerofgt_bg2scrolly_w )
  295. {
  296.     COMBINE_WORD_MEM(bg2scrolly,data);
  297. }
  298.  
  299. WRITE_HANDLER( pspikes_palette_bank_w )
  300. {
  301.     spritepalettebank = data & 0x03;
  302.     if (charpalettebank != (data & 0x1c) >> 2)
  303.     {
  304.         charpalettebank = (data & 0x1c) >> 2;
  305.         tilemap_mark_all_tiles_dirty(bg1_tilemap);
  306.     }
  307. }
  308.  
  309.  
  310.  
  311. /***************************************************************************
  312.  
  313.   Display refresh
  314.  
  315. ***************************************************************************/
  316.  
  317. static void aerofgt_spr_dopalette(void)
  318. {
  319.     int offs;
  320.     int color,i;
  321.     int colmask[32];
  322.     int pal_base;
  323.  
  324.  
  325.     for (color = 0;color < 32;color++) colmask[color] = 0;
  326.  
  327.     offs = 0;
  328.     while (offs < 0x0800 && (READ_WORD(&spriteram_2[offs]) & 0x8000) == 0)
  329.     {
  330.         int attr_start,map_start;
  331.  
  332.         attr_start = 8 * (READ_WORD(&spriteram_2[offs]) & 0x03ff);
  333.  
  334.         color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x0f00) >> 8;
  335.         map_start = 2 * (READ_WORD(&spriteram_2[attr_start + 6]) & 0x3fff);
  336.         if (map_start >= 0x4000) color += 16;
  337.  
  338.         colmask[color] |= 0xffff;
  339.  
  340.         offs += 2;
  341.     }
  342.  
  343.     pal_base = Machine->drv->gfxdecodeinfo[sprite_gfx].color_codes_start;
  344.     for (color = 0;color < 16;color++)
  345.     {
  346.         for (i = 0;i < 15;i++)
  347.         {
  348.             if (colmask[color] & (1 << i))
  349.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  350.         }
  351.     }
  352.     pal_base = Machine->drv->gfxdecodeinfo[sprite_gfx+1].color_codes_start;
  353.     for (color = 0;color < 16;color++)
  354.     {
  355.         for (i = 0;i < 15;i++)
  356.         {
  357.             if (colmask[color+16] & (1 << i))
  358.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  359.         }
  360.     }
  361. }
  362.  
  363. static void turbofrc_spr_dopalette(void)
  364. {
  365.     int color,i;
  366.     int colmask[16];
  367.     int pal_base;
  368.     int attr_start,base,first;
  369.  
  370.  
  371.     for (color = 0;color < 16;color++) colmask[color] = 0;
  372.  
  373.     pal_base = Machine->drv->gfxdecodeinfo[sprite_gfx].color_codes_start;
  374.  
  375.     base = 0;
  376.     first = 8*READ_WORD(&spriteram_2[0x3fc + base]);
  377.     for (attr_start = first + base;attr_start < base + 0x0400-8;attr_start += 8)
  378.     {
  379.         color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x000f) + 16 * spritepalettebank;
  380.         colmask[color] |= 0xffff;
  381.     }
  382.  
  383.     for (color = 0;color < 16;color++)
  384.     {
  385.         for (i = 0;i < 15;i++)
  386.         {
  387.             if (colmask[color] & (1 << i))
  388.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  389.         }
  390.     }
  391.  
  392.  
  393.     if (spriteram_2_size > 0x400)    /* turbofrc, not pspikes */
  394.     {
  395.         for (color = 0;color < 16;color++) colmask[color] = 0;
  396.  
  397.         pal_base = Machine->drv->gfxdecodeinfo[sprite_gfx+1].color_codes_start;
  398.  
  399.         base = 0x0400;
  400.         first = 8*READ_WORD(&spriteram_2[0x3fc + base]);
  401.         for (attr_start = first + base;attr_start < base + 0x0400-8;attr_start += 8)
  402.         {
  403.             color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x000f) + 16 * spritepalettebank;
  404.             colmask[color] |= 0xffff;
  405.         }
  406.  
  407.         for (color = 0;color < 16;color++)
  408.         {
  409.             for (i = 0;i < 15;i++)
  410.             {
  411.                 if (colmask[color] & (1 << i))
  412.                     palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  413.             }
  414.         }
  415.     }
  416. }
  417.  
  418.  
  419. static void aerofgt_drawsprites(struct osd_bitmap *bitmap,int priority)
  420. {
  421.     int offs;
  422.  
  423.  
  424.     priority <<= 12;
  425.  
  426.     offs = 0;
  427.     while (offs < 0x0800 && (READ_WORD(&spriteram_2[offs]) & 0x8000) == 0)
  428.     {
  429.         int attr_start;
  430.  
  431.         attr_start = 8 * (READ_WORD(&spriteram_2[offs]) & 0x03ff);
  432.  
  433.         /* is the way I handle priority correct? Or should I just check bit 13? */
  434.         if ((READ_WORD(&spriteram_2[attr_start + 4]) & 0x3000) == priority)
  435.         {
  436.             int map_start;
  437.             int ox,oy,x,y,xsize,ysize,zoomx,zoomy,flipx,flipy,color;
  438.             /* table hand made by looking at the ship explosion in attract mode */
  439.             /* it's almost a logarithmic scale but not exactly */
  440.             int zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 };
  441.  
  442.             ox = READ_WORD(&spriteram_2[attr_start + 2]) & 0x01ff;
  443.             xsize = (READ_WORD(&spriteram_2[attr_start + 2]) & 0x0e00) >> 9;
  444.             zoomx = (READ_WORD(&spriteram_2[attr_start + 2]) & 0xf000) >> 12;
  445.             oy = READ_WORD(&spriteram_2[attr_start + 0]) & 0x01ff;
  446.             ysize = (READ_WORD(&spriteram_2[attr_start + 0]) & 0x0e00) >> 9;
  447.             zoomy = (READ_WORD(&spriteram_2[attr_start + 0]) & 0xf000) >> 12;
  448.             flipx = READ_WORD(&spriteram_2[attr_start + 4]) & 0x4000;
  449.             flipy = READ_WORD(&spriteram_2[attr_start + 4]) & 0x8000;
  450.             color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x0f00) >> 8;
  451.             map_start = 2 * (READ_WORD(&spriteram_2[attr_start + 6]) & 0x3fff);
  452.  
  453.             zoomx = 16 - zoomtable[zoomx]/8;
  454.             zoomy = 16 - zoomtable[zoomy]/8;
  455.  
  456.             for (y = 0;y <= ysize;y++)
  457.             {
  458.                 int sx,sy;
  459.  
  460.                 if (flipy) sy = ((oy + zoomy * (ysize - y) + 16) & 0x1ff) - 16;
  461.                 else sy = ((oy + zoomy * y + 16) & 0x1ff) - 16;
  462.  
  463.                 for (x = 0;x <= xsize;x++)
  464.                 {
  465.                     int code;
  466.  
  467.                     if (flipx) sx = ((ox + zoomx * (xsize - x) + 16) & 0x1ff) - 16;
  468.                     else sx = ((ox + zoomx * x + 16) & 0x1ff) - 16;
  469.  
  470.                     if (map_start < 0x4000)
  471.                         code = READ_WORD(&aerofgt_spriteram1[map_start & 0x3fff]) & 0x1fff;
  472.                     else
  473.                         code = READ_WORD(&aerofgt_spriteram2[map_start & 0x3fff]) & 0x1fff;
  474.  
  475.                     if (zoomx == 16 && zoomy == 16)
  476.                         drawgfx(bitmap,Machine->gfx[sprite_gfx + (map_start >= 0x4000 ? 1 : 0)],
  477.                                 code,
  478.                                 color,
  479.                                 flipx,flipy,
  480.                                 sx,sy,
  481.                                 &Machine->drv->visible_area,TRANSPARENCY_PEN,15);
  482.                     else
  483.                         drawgfxzoom(bitmap,Machine->gfx[sprite_gfx + (map_start >= 0x4000 ? 1 : 0)],
  484.                                 code,
  485.                                 color,
  486.                                 flipx,flipy,
  487.                                 sx,sy,
  488.                                 &Machine->drv->visible_area,TRANSPARENCY_PEN,15,
  489.                                 0x1000 * zoomx,0x1000 * zoomy);
  490.                     map_start += 2;
  491.                 }
  492.             }
  493.         }
  494.  
  495.         offs += 2;
  496.     }
  497. }
  498.  
  499. static void turbofrc_drawsprites(struct osd_bitmap *bitmap,int chip)
  500. {
  501.     int attr_start,base,first;
  502.  
  503.  
  504.     base = chip * 0x0400;
  505.     first = 8*READ_WORD(&spriteram_2[0x3fc + base]);
  506.  
  507.     for (attr_start = base + 0x0400-16;attr_start >= first + base;attr_start -= 8)
  508.     {
  509.         int map_start;
  510.         int ox,oy,x,y,xsize,ysize,zoomx,zoomy,flipx,flipy,color,pri;
  511.         /* table hand made by looking at the ship explosion in attract mode */
  512.         /* it's almost a logarithmic scale but not exactly */
  513.         int zoomtable[16] = { 0,7,14,20,25,30,34,38,42,46,49,52,54,57,59,61 };
  514.  
  515.         if (!(READ_WORD(&spriteram_2[attr_start + 4]) & 0x0080)) continue;
  516.  
  517.         ox = READ_WORD(&spriteram_2[attr_start + 2]) & 0x01ff;
  518.         xsize = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x0700) >> 8;
  519.         zoomx = (READ_WORD(&spriteram_2[attr_start + 2]) & 0xf000) >> 12;
  520.         oy = READ_WORD(&spriteram_2[attr_start + 0]) & 0x01ff;
  521.         ysize = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x7000) >> 12;
  522.         zoomy = (READ_WORD(&spriteram_2[attr_start + 0]) & 0xf000) >> 12;
  523.         flipx = READ_WORD(&spriteram_2[attr_start + 4]) & 0x0800;
  524.         flipy = READ_WORD(&spriteram_2[attr_start + 4]) & 0x8000;
  525.         color = (READ_WORD(&spriteram_2[attr_start + 4]) & 0x000f) + 16 * spritepalettebank;
  526.         pri = READ_WORD(&spriteram_2[attr_start + 4]) & 0x0010;
  527.         map_start = 2 * READ_WORD(&spriteram_2[attr_start + 6]);
  528.  
  529.         zoomx = 16 - zoomtable[zoomx]/8;
  530.         zoomy = 16 - zoomtable[zoomy]/8;
  531.  
  532.         for (y = 0;y <= ysize;y++)
  533.         {
  534.             int sx,sy;
  535.  
  536.             if (flipy) sy = ((oy + zoomy * (ysize - y) + 16) & 0x1ff) - 16;
  537.             else sy = ((oy + zoomy * y + 16) & 0x1ff) - 16;
  538.  
  539.             for (x = 0;x <= xsize;x++)
  540.             {
  541.                 int code;
  542.  
  543.                 if (flipx) sx = ((ox + zoomx * (xsize - x) + 16) & 0x1ff) - 16;
  544.                 else sx = ((ox + zoomx * x + 16) & 0x1ff) - 16;
  545.  
  546.                 if (chip == 0)
  547.                     code = READ_WORD(&aerofgt_spriteram1[map_start % aerofgt_spriteram1_size]);
  548.                 else
  549.                     code = READ_WORD(&aerofgt_spriteram2[map_start % aerofgt_spriteram2_size]);
  550.  
  551.                 if (zoomx == 16 && zoomy == 16)
  552.                     pdrawgfx(bitmap,Machine->gfx[sprite_gfx + chip],
  553.                             code,
  554.                             color,
  555.                             flipx,flipy,
  556.                             sx,sy,
  557.                             &Machine->drv->visible_area,TRANSPARENCY_PEN,15,
  558.                             pri ? 0 : 0x2);
  559.                 else
  560.                     pdrawgfxzoom(bitmap,Machine->gfx[sprite_gfx + chip],
  561.                             code,
  562.                             color,
  563.                             flipx,flipy,
  564.                             sx,sy,
  565.                             &Machine->drv->visible_area,TRANSPARENCY_PEN,15,
  566.                             0x1000 * zoomx,0x1000 * zoomy,
  567.                             pri ? 0 : 0x2);
  568.                 map_start += 2;
  569.             }
  570.  
  571.             if (xsize == 2) map_start += 2;
  572.             if (xsize == 4) map_start += 6;
  573.             if (xsize == 5) map_start += 4;
  574.             if (xsize == 6) map_start += 2;
  575.         }
  576.     }
  577. }
  578.  
  579.  
  580. void pspikes_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  581. {
  582.     int i,scrolly;
  583.  
  584.     tilemap_set_scroll_rows(bg1_tilemap,256);
  585.     scrolly = READ_WORD(bg1scrolly);
  586.     for (i = 0;i < 256;i++)
  587.         tilemap_set_scrollx(bg1_tilemap,(i + scrolly) & 0xff,READ_WORD(&aerofgt_rasterram[2*i]));
  588.     tilemap_set_scrolly(bg1_tilemap,0,scrolly);
  589.  
  590.     tilemap_update(ALL_TILEMAPS);
  591.  
  592.     palette_init_used_colors();
  593.     turbofrc_spr_dopalette();
  594.     if (palette_recalc())
  595.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  596.  
  597.     tilemap_render(ALL_TILEMAPS);
  598.  
  599.     fillbitmap(priority_bitmap,0,NULL);
  600.  
  601.     tilemap_draw(bitmap,bg1_tilemap,0);
  602.     turbofrc_drawsprites(bitmap,0);
  603. }
  604.  
  605. void karatblz_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  606. {
  607.     tilemap_set_scrollx(bg1_tilemap,0,READ_WORD(bg1scrollx)-8);
  608.     tilemap_set_scrolly(bg1_tilemap,0,READ_WORD(bg1scrolly));
  609.     tilemap_set_scrollx(bg2_tilemap,0,READ_WORD(bg2scrollx)-4);
  610.     tilemap_set_scrolly(bg2_tilemap,0,READ_WORD(bg2scrolly));
  611.  
  612.     tilemap_update(ALL_TILEMAPS);
  613.  
  614.     palette_init_used_colors();
  615.     turbofrc_spr_dopalette();
  616.     if (palette_recalc())
  617.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  618.  
  619.     tilemap_render(ALL_TILEMAPS);
  620.  
  621.     fillbitmap(priority_bitmap,0,NULL);
  622.  
  623.     tilemap_draw(bitmap,bg1_tilemap,0);
  624.     tilemap_draw(bitmap,bg2_tilemap,0);
  625.  
  626.     /* we use the priority buffer so sprites are drawn front to back */
  627.     turbofrc_drawsprites(bitmap,1);
  628.     turbofrc_drawsprites(bitmap,0);
  629. }
  630.  
  631. void spinlbrk_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  632. {
  633.     int i,scrolly;
  634.  
  635.     tilemap_set_scroll_rows(bg1_tilemap,512);
  636.     scrolly = 0;
  637.     for (i = 0;i < 256;i++)
  638.         tilemap_set_scrollx(bg1_tilemap,(i + scrolly) & 0x1ff,READ_WORD(&aerofgt_rasterram[2*i])-8);
  639. //    tilemap_set_scrolly(bg1_tilemap,0,READ_WORD(bg1scrolly));
  640.     tilemap_set_scrollx(bg2_tilemap,0,READ_WORD(bg2scrollx)-4);
  641. //    tilemap_set_scrolly(bg2_tilemap,0,READ_WORD(bg2scrolly));
  642.  
  643.     tilemap_update(ALL_TILEMAPS);
  644.  
  645.     palette_init_used_colors();
  646.     turbofrc_spr_dopalette();
  647.     if (palette_recalc())
  648.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  649.  
  650.     tilemap_render(ALL_TILEMAPS);
  651.  
  652.     fillbitmap(priority_bitmap,0,NULL);
  653.  
  654.     tilemap_draw(bitmap,bg1_tilemap,0);
  655.     tilemap_draw(bitmap,bg2_tilemap,0);
  656.  
  657.     /* we use the priority buffer so sprites are drawn front to back */
  658.     turbofrc_drawsprites(bitmap,0);
  659.     turbofrc_drawsprites(bitmap,1);
  660. }
  661.  
  662. void turbofrc_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  663. {
  664.     int i,scrolly;
  665.  
  666.     tilemap_set_scroll_rows(bg1_tilemap,512);
  667.     scrolly = READ_WORD(bg1scrolly)+2;
  668.     for (i = 0;i < 256;i++)
  669. //        tilemap_set_scrollx(bg1_tilemap,(i + scrolly) & 0x1ff,READ_WORD(&aerofgt_rasterram[2*i])-11);
  670.         tilemap_set_scrollx(bg1_tilemap,(i + scrolly) & 0x1ff,READ_WORD(&aerofgt_rasterram[0xe])-11);
  671.     tilemap_set_scrolly(bg1_tilemap,0,scrolly);
  672.     tilemap_set_scrollx(bg2_tilemap,0,READ_WORD(bg2scrollx)-7);
  673.     tilemap_set_scrolly(bg2_tilemap,0,READ_WORD(bg2scrolly)+2);
  674.  
  675.     tilemap_update(ALL_TILEMAPS);
  676.  
  677.     palette_init_used_colors();
  678.     turbofrc_spr_dopalette();
  679.     if (palette_recalc())
  680.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  681.  
  682.     tilemap_render(ALL_TILEMAPS);
  683.  
  684.     fillbitmap(priority_bitmap,0,NULL);
  685.  
  686.     tilemap_draw(bitmap,bg1_tilemap,0);
  687.     tilemap_draw(bitmap,bg2_tilemap,1<<16);
  688.  
  689.     /* we use the priority buffer so sprites are drawn front to back */
  690.     turbofrc_drawsprites(bitmap,1);
  691.     turbofrc_drawsprites(bitmap,0);
  692. }
  693.  
  694. void aerofgt_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  695. {
  696.     tilemap_set_scrollx(bg1_tilemap,0,READ_WORD(&aerofgt_rasterram[0x0000])-18);
  697.     tilemap_set_scrolly(bg1_tilemap,0,READ_WORD(bg1scrolly));
  698.     tilemap_set_scrollx(bg2_tilemap,0,READ_WORD(&aerofgt_rasterram[0x0400])-20);
  699.     tilemap_set_scrolly(bg2_tilemap,0,READ_WORD(bg2scrolly));
  700.  
  701.     tilemap_update(ALL_TILEMAPS);
  702.  
  703.     palette_init_used_colors();
  704.     aerofgt_spr_dopalette();
  705.     if (palette_recalc())
  706.         tilemap_mark_all_pixels_dirty(ALL_TILEMAPS);
  707.  
  708.     tilemap_render(ALL_TILEMAPS);
  709.  
  710.     fillbitmap(priority_bitmap,0,NULL);
  711.  
  712.     tilemap_draw(bitmap,bg1_tilemap,0);
  713.  
  714.     aerofgt_drawsprites(bitmap,0);
  715.     aerofgt_drawsprites(bitmap,1);
  716.  
  717.     tilemap_draw(bitmap,bg2_tilemap,0);
  718.  
  719.     aerofgt_drawsprites(bitmap,2);
  720.     aerofgt_drawsprites(bitmap,3);
  721. }
  722.